/**
 * Acciones jQuery a realizar una vez la página esté cargada
 *
 */
$(window).before(function(){
//$(document).ready(function(){

    Common.init();
    
    Common.cargar_propiedades();

    /**
     * Formulario de login
     * Llama por AJAX al archivo de login que mira las credenciales del usuario y crea la sesión php
     * Si todo va bien modifica la variable global ID_USUARIO utilizada en la aplicación y va al inicio de la aplicación
     */
    $('form#frm_login').live('submit',function(){

        var user = $('#user').val();
        var pass = $('#pass').val();

        $.post('../login/login.php', {user: user, pass: pass}, function(data){
            var jsonData = jQuery.parseJSON(data);

            if(jsonData.ok){
                ID_USUARIO = user;
                Common.dentro = true;
                $(document).trigger('connect', {name: ID_USUARIO, from_login: true});
                Common.inicio();
                //window.location = 'index.php';
            }else{
                Common.error(jsonData.error);
            }
        });

        return false;
    });

    // Selección múltiple de checkboxes
    $('#chk_todos').live('click',function(){
        if($('#chk_todos').attr("checked"))
            $('.chk').attr("checked", "checked");
        else
            $('.chk').removeAttr("checked");
    });

    // Log de la aplicación
    $("#new_song_log").live('click',function(){
        $(this).hide();
        Common.ir_al_inicio();
    });
    
    //Switch the "Open" and "Close" state per click then slide up/down (depending on open/close state)
    $("#submenu_cab").live('click',function(){
        $(this).toggleClass("submenu");
        $("#list_submenu").slideToggle();
    });

    //Cargar mediante AJAX asociado a los hipervínculos de clase load
    $('a.load').live('click',function(event){
        event.preventDefault();
        Common.cargar($(this));
    });

    $('a.menu_sel').live('click', function(event){
        event.preventDefault();
        $('a.sel').removeClass('sel');
        $(this).addClass('sel');
    });

    //Ejecución de funciones
    $('a.exec').live('click',function(event){
       event.preventDefault();
       var Clase = $(this).attr('clase');
       var funcion = $(this).attr('href');

       eval(Clase+"."+funcion);
    });

    // TODO: ¿Esto se usa?
    $('.comentarios_cancion a:not(.del_Comentario').live('click',function(event){
        event.preventDefault();
        $(this).attr('target', '_blank');

        if(confirm('Enlace externo. ¿Abrir?'))
            window.open($(this).attr('href'));
    });

    //Buscador general. Buscador que se encuentra en el menú
    $('#buscador_general').live('submit',function(){
        Common.reset_form('frm_canciones');
        $('#titulo_artista').val($('#txt_general').val());
        Canciones.buscar();
        return false;
    });

    $('.close').live('click',function(){
        var obj_cerrar = $(this).attr('cerrar');
        $('#'+obj_cerrar).hide();
    });

    $('.close_th').live('click',function(){
        tb_remove();
    });

    $('#aleatorio').live('click',function(){
       $(this).toggleClass('desactivado activado');
    });

    // Al cargar la aplicación ejecutamos el método de inicio
    Common.inicio();
    
});

/**
 * Clase Common
 * Funciones más comunes, no específicas para ningún contexto
 *
 */
var Common = {

    // Estos atributos son objetos selectores de jQuery, se utilizan para no tener que usar constantemente la sintaxis de jQuery
    capa_ajax : null,
    contenido : null,
    titulo : null,
    submenu : null,
    player_list: null,
    reproductor: null,
    info_cancion: null,
    lista_comentarios:null,

    // Indica si hemos entrado en la aplicación
    dentro: null,

    // Indica en qué casos se ha de mostrar la lista de canciones
    mostrar_canciones : null,

    reproducir_todas: null,

    // Inicializa los atributos anteriores
    init : function(){
        this.capa_ajax         = $('#ajax-loader');
        this.contenido         = $('#main-content');
        this.titulo            = $('#titulo');
        this.submenu           = $('#submenu');
        this.player_list       = $('#player_list');
        this.reproductor       = $('#reproductor');
        this.info_cancion      = $('#info_cancion');
        this.lista_comentarios = $('#list_comments');
    },

    in_array: function(elem, array){
        
        for(i=0;i<array.length;i++){
            if(array[i] == elem)
                return true;
        }
        
        return false;
    },

    // Carga por AJAX el script correspondiente en el elemento <a> en la capa de contenido
    // El script a cargar está en el atributo href del elemento <a>
    // En la función callback cargamos el submenú, recargamos la propiedades y establecemos el contenido en su capa correspondiente
    cargar : function(a_elem){
        Canciones.id_lista_viendo = 0;
        Common.mostrar_canciones = false;
        if(a_elem.attr('mostrar_canciones'))
            Common.mostrar_canciones = true;

        // Muestra el GIF AJAX loader
        //$(document).trigger('cargando', {txt: 'Cargando...'});
        Common.cargando('Cargando...');
        
        $.ajax({
            url: a_elem.attr('href'),
            success: function(data){
                //$(document).trigger('descargando');
                Common.descargando();
                
                //Common.titulo.html(a_elem.html());
                var submenu = a_elem.attr('submenu');
                if(submenu)
                    Common.submenu.load(submenu, function(){
                        Common.cargar_propiedades();
                    });
                else
                    Common.submenu.html(a_elem.html());

                Common.establecer_contenido(data);

                if(Common.reproducir_todas){
                    Common.reproducir_todas = false;
                    Canciones.reproducir_todas();
                }
            }
        });
    },

    //Propiedas de los elementos jquery que han de persistir
    cargar_propiedades : function(){
        $('.corner').corner();
        $('.corner_top').corner("top");

        $('.draggable').draggable(
            {zIndex: 1000, ghosting: false, opacity: 0}
        );
        $('.draggable').css('cursor','move');

        $('.fecha').datepicker();
        //Hide (Collapse) the toggle containers on load
        $("#list_submenu").hide();

        $('.sortable').tablesorter();

        // Escritura de comentarios
        $('textarea.comentario').elastic();
        $('textarea.comentario').val('Escribe un comentario...');
        $('textarea.comentario').live('click',function(){ 
            var id_cancion = $(this).attr('cancion');
            if($(this).val() == 'Escribe un comentario...')
                $(this).val('');
            $('#boton_comentario-'+id_cancion).css('display','block');
        });

        $('ul.sortable-list').sortable({
            placeholder : '#content_sortable'
        });
        $('tbody.sortable-list').sortable({
            placeholder : '#lista_canciones'
        });

        tb_init('a.thickbox');

        $('.file').customFileInput();
        //Reiniciamos las constantes
        Common.init();
    },

    // Salida de la aplicación. Desconectamos xmpp, establecemos cookies a null y deslogueamos
    exit : function(){
        if(XMPP.connection)
            XMPP.connection.disconnect();
        
        $.cookie('xmppconnection',null);

        $.get('../login/logout.php',function(){
            window.location = 'index.php';
        });
    },

    // Muestra un mensaje de error. Llama a la función que muestra un mensaje indicándole que es un error
    error : function(error_msg){
        Common.msg_resultado(error_msg, false);        
    },

    // Carga el html pasado en la capa de contenido
    establecer_contenido: function(data){
        Common.contenido.html(data);
        Common.cargar_propiedades();
    },

    // Carga el html pasado en la capa de la lista de canciones
    establecer_contenido_canciones: function(data){
        Common.contenido.html(data);//$('#contenido_canciones').html(data);
        Common.cargar_propiedades();
    },

    // Realiza un toggle jQuery al elemento indicado
    toggle : function(id_dom){
        $('#'+id_dom).toggle();
    },

    // Muestra el GIF AJAX loader con el texto pasado
    cargando : function(txt){
        Common.contenido.html('<div style="margin: 0 auto">'+txt+' <img src="../../img/ajax-loader.gif" /></div> ');
    },

    // Oculta el GIF AJAX loader
    descargando : function(){
        //Common.capa_ajax.css('display','none');
    },

    // Muestra un mensaje del sistema. El parámetro 'ok indica si es un mensaje de error o de verificación
    msg_resultado : function(msg, ok){
        if(msg){
            if(ok)
                var clase='info_system_ok';
            else
                var clase='info_system_error';

            var html='<p class="'+clase+'">'+msg+'</p>';
            
            Common.msg_show(html, 'msg_res');
        }        
    },

    // Muestra el html en el elemento pasado realizando una serie de efectos jQuery (se muestra y se quita pasados 2 segundos)
    msg_show : function(html, id_dom){
        $('#'+id_dom).show();
         $('#'+id_dom).html(html).delay(2000).fadeOut(1000, function(){
                $(this).html('');
            });
    },

    // Inicio de la aplicación. Carga el texto por defecto para cuando no se está logueado. Carga el menú, y lanza el evento connect si ya estamos logueados
    inicio : function(){
        Common.cargar_menu();

        if(!Common.dentro){ 
            if(ID_USUARIO){
                Common.dentro = true;
                $(document).trigger('connect', {name: ID_USUARIO});
            }
        }
        Common.ir_al_inicio();
    },

    // Carga el menú
    cargar_menu: function(){
        $.get('../../common/menu.php', function(data){
           $('#menu-wrapper').html(data);
        });
    },

    // Va a la lista de canciones, para ello carga el menú y hace click en el elemento <a> que nos lleva a la lista.
    ir_al_inicio: function(){

        //contenido de la izquierda (reproducción)
        $.get('subscripts/reproduccion.php', function(data){
            $('#content-left').html(data);
        });

        //submenu
        $.get('submenus/menu_canciones.php', function(data){
            $('#lista_submenu').html(data);
        });
        
        $.get('../../common/menu.php', function(data){
           $('#menu-wrapper').html(data);
           Common.reproducir_todas = true;
           $('#buscar_canciones').click();
        });
    },

    open_list: function(){
        Common.toggle('player_list');
        if($('#flecha').attr('class') == 'up')//quitar la clase, estamos cerrando
            $('#flecha').removeClass('up');
        else
            $('#flecha').attr('class','up');
    },
        
    // Muestra el mensaje en el log de la aplicación
    log: function(msg){
        $('#log').append('<p>'+msg+'</p>');
    },

    // Resetea un formulario
    reset_form: function(id_frm){
        $(id_frm).find(':input').each(function() {
            switch(this.type) {
                case 'password':
                case 'select-multiple':
                case 'select-one':
                case 'text':
                case 'file':
                case 'textarea':
                    $(this).val('');
                    break;
                case 'checkbox':
                case 'radio':
                    this.checked = false;
            }
        });
    },

    // Función que prepara el formulario de listas de reproducción para la acción requerida:
    // - presenta la capa
    // - indica la función que se va a ejecutar de la clase Canciones
    accion_lista: function(funcion){
        Common.toggle('listas-wrapper');
        $('#accion_lista').val(funcion);
    },
    edit_profile: function(){
        $('#subiendo_imagen').toggle();
        $('#subir_imagen').val(1);
        $('#frm_subir_imagen').submit();
    },
    perfil_editado: function(ok){
        $('#subiendo_imagen').toggle();
        if(ok){
            Common.reset_form('#frm_subir_imagen');
            Common.cargar_menu();
            Canciones.buscar();
            //Cambiamos los datos
            
            $('#edit_profile-wrapper').toggle();
        }
    },
    avatar_actualizado: function(){        
        tb_remove();
        Common.cargar_menu();

        var id_cancion = Canciones.get_id_cancion_reproduccion();

        $.get('_info_cancion.php',{id_cancion: id_cancion}, function(data){
            var json = jQuery.parseJSON(data);
            Common.log(json.info);
            if(json.file){                
                Common.info_cancion.html(json.info);
                Common.lista_comentarios.html(json.comentarios);
            }
        });
    }
};

// Evento cargando, muestra el GIF AJAX loader
$(document).bind('cargando', function(ev, data){
    Common.contenido.html('');
    Common.cargando(data.txt);
});

// Equivalente
$(document).bind('descargando', function(){
    Common.descargando();
});